package register

import (
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	. "go_tempate/SQL/table"
	. "go_tempate/common/function"
	. "go_tempate/common/store"
)

// 用户注册
// ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
func PutRegister(ctx *gin.Context) {
	register := &Register{} // 注册信息体

	body := ObtainResponseBody(ctx) // 获取当前的响应结构体

	err := ObtainRequestContent(ctx, body, register) // 进行获取并验证当前请求体中的数据

	//如果出现报错
	//----------------------------------------------------------------------------------------------------------
	if err != nil {
		return
	}

	//密保问题加密
	//----------------------------------------------------------------------------------------------------------
	//循环结构体进行对应的操作
	for i, v := range register.UserSecurity {
		//生成前端加密格式的密保答案
		encryptionAnswer, err := GenerateFromPassword(v.Answer, false)

		if err != nil {
			//设置当前返回结构体
			body.BatchSettings(ConfidentialityErr, UserConfidentialityEncryptionError, nil)
			return
		}

		//根据前端加密格式的密码进行二次生成后台入库密保答案
		sqlAnswer, err := GenerateFromPassword(encryptionAnswer, true)

		if err != nil {
			//设置当前返回结构体
			body.BatchSettings(ConfidentialityErr, UserConfidentialityEncryptionError, nil)
			return
		}

		//重新赋予密保答案,因为是结构体故，循环的 v是值拷贝，所以要使用对应的位置信息才能进行数据修改
		register.UserSecurity[i].Answer = sqlAnswer
	}

	//入库注册
	//----------------------------------------------------------------------------------------------------------
	account := GenerateAccount(8) //生成账户

	//生成前端加密格式的密码
	//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	pePassword, err := GenerateFromPassword(register.Password, false)

	if err != nil {
		//设置当前返回结构体
		body.BatchSettings(PasswordErr, UserPasswordEncryptionErr, nil)
		return
	}

	//根据前端加密格式的密码进行二次生成后台入库密码
	//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	sqlPassword, err := GenerateFromPassword(pePassword, true)

	if err != nil {
		//设置当前返回结构体
		body.BatchSettings(PasswordErr, UserPasswordEncryptionErr, nil)
		return
	}

	//声明入库信息结构体
	//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	var newUserInfo = UserInfo{
		Name:   register.Name,
		Age:    register.Age,
		Gender: register.Gender,

		LoginInfo: LoginInfo{
			Account:  account,
			Password: sqlPassword,
		},

		UserSecurity: register.UserSecurity,
	}

	//入库
	//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	_ = newUserInfo.CreateUser()

	//返回注册成功的账号
	//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	body.Data = map[string]string{
		"account": account,
	}

	zap.S().Infof("%v用户注册成功;其账号为:%v", newUserInfo.Name, account)

}
